import "mod_grproc"
import "mod_text"
import "mod_wm"
import "mod_map"
import "mod_proc"
import "mod_video"
import "mod_rand"
import "mod_draw"

include "../../commons/global.prg"
include "../../commons/keys_control.prg"

Const
  PONG_WIDTH_TILE = 20;
  PONG_HEIGHT_TILE = 20;
  PONG_WIDTH_BOARD = 40;
  PONG_HEIGHT_BOARD = 15;
  PONG_SQUARE =0;
  PONG_CIRCLE = 1;
  PONG_BLOCK_TYPE_1 = 1;
  PONG_BLOCK_TYPE_2 = 2;
  
End

Global
    PONG_player PONG_id_player;
    PONG_computer PONG_id_computer;
    PONG_stage PONG_id_stage;
    PONG_ball PONG_id_ball;
	PONG_donde_va_y;
End

//-----------------------------------------------------------------------------------------------------------------------

Begin
    initialice_game();
	PONG_main();
End

Process PONG_main()
private
  Int i;
End
Begin
  write(0,400,200,1,"Pong");
  write(0,400,450,1,"Pulsa intro para Empezar");
  write(0,400,470,1,"o escape Salir");
  While (!is_key_pressed(PLAYER_1,KEY_START))  
    If(is_key_pressed(PLAYER_1,KEY_CLOSE))
      While (is_key_pressed(PLAYER_1,KEY_CLOSE))
        Frame;
      End
      let_me_alone();
      delete_text(all_text);
      //menu();
      return;
    End
    Frame;
  End                              
  delete_text(all_text);
  // Iniciamos el proceso del escenario
  PONG_id_stage =PONG_stage();
End

Process PONG_stage()
public
     int left_limit =0;
     int right_limit ;
     int up_limit = 0;
     int down_limit ;
private
     int i;
     int id_text[10];
     int num_of_texts;
Begin
    right_limit = SCREEN_WIDTH;
    down_limit = SCREEN_HEIGHT;
    // Iniciamos el proceso pala que manejar� el Jugador
    PONG_id_player=PONG_player(left_limit+PONG_WIDTH_TILE,down_limit/2);
    // Iniciamos el proceso pala que manejar� el ordenador
    PONG_id_computer=PONG_computer(right_limit-PONG_WIDTH_TILE,down_limit/2);
    
    While (!is_key_pressed(PLAYER_1,KEY_CLOSE))
        If  (!PONG_id_ball)
            // No hay bola en juego
            If (is_key_pressed(PLAYER_1,KEY_A))
               PONG_id_ball =PONG_ball(300,260);
            End
        End
        Frame;
    End
    // Eliminamos textos auxiliares si es el caso.
    For (i=0;i<num_of_texts;i++)
        delete_text(id_text[i]);
    End
End

Process PONG_player(x,y)
public
  int points;
  int lives =3;
  int current_height;
Private
  int MAX_HEIGHT_STICK  =4;
  int i,j;
  int normal_move = 5;
  int rapid_move = 15;
  int current_move;
  int id_text[100];
  int num_of_texts;
End
Begin
  graph=new_map(PONG_WIDTH_TILE,MAX_HEIGHT_STICK*PONG_HEIGHT_TILE,SCREEN_DEPTH);
  current_height = 4;
  map_clear(0,graph,0);
  /* COLORES
    Rojo + Azul = Morado
    Rojo + Verde = Amarillo
    Verde + Azul= Celeste
  */
  // Dibujamos el palo del Jugador
  For (j = 0; j< current_height; j++)
    PONG_print_block(0,graph, RGB(255,0,255) , 0 , j,PONG_SQUARE);
  End
  // Dibujamos el panel de puntuaci�n
  id_text[num_of_texts++]=write(0,125,570,4,"Puntos:");
  id_text[num_of_texts++]=write_var(0,220,570,4,points);
  id_text[num_of_texts++]=write(0,125,580,4,"Vidas:");
  id_text[num_of_texts++]=write_var(0,220,580,4,lives);
 
  While (!is_key_pressed(PLAYER_1,KEY_CLOSE))
    If(is_key_pressed(PLAYER_1,KEY_A))
        current_move=rapid_move;
    Else
        current_move=normal_move;
    End
    // Hay que recordar que x e y indican el centro del graph
    If(is_key_pressed(PLAYER_1,KEY_UP))
        If (y - current_move > PONG_id_stage.up_limit + current_height* PONG_HEIGHT_TILE /2 )
            y-=current_move;
        End
    End
    If(is_key_pressed(PLAYER_1,KEY_DOWN))
        If (y + current_height *PONG_HEIGHT_TILE/2 + current_move < PONG_id_stage.down_limit )
            y+=current_move;
        End
    End
    If (lives <=0)
        // Nos hemos quedado sin vidas
        let_me_alone();
        id_text[num_of_texts++]=write(0,300,280,4,"Has perdido. Pulsa START");
        // Esperamos a que pulse la tecla START
        While (!is_key_pressed(PLAYER_1,KEY_START))
            Frame;
        End
        While (is_key_pressed(PLAYER_1,KEY_START))
            Frame;
        End
        // Reiniciamos el men� del juego
        PONG_main();
        //y salimos de este proceso actual rompiendo el bucle
        Break;
    End
    Frame;
  End

  // Eliminamos textos auxiliares.
  For (i=0;i<num_of_texts;i++)
    delete_text(id_text[i]);
  End
  unload_map(0,graph);
End

Process PONG_computer(x,y)
public
  int points;
  int lives =3;
  int current_height;
Private
  int MAX_HEIGHT_STICK  =4;
  int i,j;
  int normal_move = 5;
  int rapid_move = 15;
  int current_move;
  int id_text[100];
  int num_of_texts;
End
Begin
  graph=new_map(PONG_WIDTH_TILE,MAX_HEIGHT_STICK*PONG_HEIGHT_TILE,SCREEN_DEPTH);
  current_height = 4;
  map_clear(0,graph,0);
  /* COLORES
    Rojo + Azul = Morado
    Rojo + Verde = Amarillo
    Verde + Azul= Celeste
  */
  // Dibujamos el palo del Jugador
  For (j = 0; j< current_height; j++)
    PONG_print_block(0,graph, RGB(0,0,255) , 0 , j,PONG_SQUARE);
  End
  // Dibujamos el panel de puntuaci�n
  id_text[num_of_texts++]=write(0,425,570,4,"Puntos:");
  id_text[num_of_texts++]=write_var(0,520,570,4,points);
  id_text[num_of_texts++]=write(0,425,580,4,"Vidas:");
  id_text[num_of_texts++]=write_var(0,520,580,4,lives);
 
  While (!is_key_pressed(PLAYER_1,KEY_CLOSE))
    // Hay que recordar que x e y indican el centro del graph
    If (PONG_id_ball !=0)
		If( PONG_id_ball.x > PONG_id_stage.right_limit/2) 
			If ( y < PONG_donde_va_y - 20 )	y+=4; end
			If ( y > PONG_donde_va_y + 20 )	y-=4; end
		End 
    End
    If (lives <=0)
        // Nos hemos quedado sin vidas
        let_me_alone();
        id_text[num_of_texts++]=write(0,300,280,4,"Has ganado. Pulsa START");
        // Esperamos a que pulse la tecla START
        While (!is_key_pressed(PLAYER_1,KEY_START))
            Frame;
        End
        While (is_key_pressed(PLAYER_1,KEY_START))
            Frame;
        End
        // Reiniciamos el men� del juego
        PONG_main();
        //y salimos de este proceso actual rompiendo el bucle
        Break;
    End
    Frame;
  End

  // Eliminamos textos auxiliares.
  For (i=0;i<num_of_texts;i++)
    delete_text(id_text[i]);
  End
  unload_map(0,graph);
End

Process PONG_ball(x,y)
Private
  int i,j;
  int current_dir_x =1, current_dir_y =-1;
  int move_x = 5;
  int move_y = 5;
  PONG_player col_stick;
End
Begin
  graph=new_map(PONG_WIDTH_TILE,PONG_HEIGHT_TILE,SCREEN_DEPTH);
  map_clear(0,graph,0);
  PONG_print_block(0,graph, RGB(255,0,0) , i , 0,PONG_CIRCLE);
  PONG_donde_va_la_bola(x,y,current_dir_x,move_x,move_y);
  While (!is_key_pressed(PLAYER_1,KEY_CLOSE))
    x+=current_dir_x*move_x;
    y+=move_y;
    // Cambiamos direcci�n x si se llega al l�mite de arriba o abajo del escenario
    If ( y<= PONG_id_stage.up_limit OR y + PONG_HEIGHT_TILE > PONG_id_stage.down_limit)
        move_y *= -1;
    End
    // Cambiamos direcci�n si colisiona contra otro proceso
    col_stick = collision(type PONG_player);
    If (col_stick)
       // Ha chocado contra nuestro palo
       current_dir_x *= -1; // Hacemos que vaya hacia la direcci�n contraria.
       // Ahora tenemos que decidir la direcci�n veritical
       If (y < col_stick.y )
			move_y -= get_dist(col_stick)/4;
       Else
	   		move_y += get_dist(col_stick)/4;
       End
	   
       if (current_dir_x == 1)
            x = col_stick.x + PONG_WIDTH_TILE;
       else
            x = col_stick.x - PONG_WIDTH_TILE;
       End 
	   PONG_donde_va_la_bola(x,y,current_dir_x,move_x,move_y);
   End
    col_stick = collision(type PONG_computer);
    If (col_stick)
       // Ahora tenemos que decidir la direcci�n veritical
       If (y < col_stick.y )
			move_y -= get_dist(col_stick)/4;
       Else
	   		move_y += get_dist(col_stick)/4;
       End

       current_dir_x *= -1; // Hacemos que vaya hacia la direcci�n contraria.
       if (current_dir_x == 1)
            x = col_stick.x + PONG_WIDTH_TILE;
       else
            x = col_stick.x - PONG_WIDTH_TILE;
       End 
    End
    
    // Si pasamos el l�mite izquierdo, perdemos una vida
    If (x< PONG_id_stage.left_limit)
        PONG_id_player.lives --;
        break;
    End
    If (x> PONG_id_stage.right_limit)
        PONG_id_computer.lives --;
        break;
    End
    Frame;
  End
  unload_map(0,graph);
  // Al salir ponemos el identificador a 0 para poder crear otra bola con el bot�n A
  PONG_id_ball = 0;
End

function PONG_print_block(int file,int graph, int color,int x, int y, int id_type )
private
  int block_map,block_border_map;
begin
  block_map = new_map(PONG_WIDTH_TILE-2,PONG_HEIGHT_TILE-2,16);
  if (id_type == PONG_CIRCLE)
      Drawing_map(0,block_map);
      drawing_color(color);
      draw_fcircle(9,9,8);
  else
      map_clear(0,block_map,color);
  end
  block_border_map = new_map(PONG_WIDTH_TILE,PONG_HEIGHT_TILE,SCREEN_DEPTH);
  map_clear(0,block_border_map,RGB(0,0,0));
  map_xputnp(0,block_border_map,0,block_map,10,10,0,10,20,0);  
  map_xputnp(0,graph,0,block_map,10+PONG_WIDTH_TILE*x,10+PONG_HEIGHT_TILE*y,0,100,100,0);
  unload_map(0,block_map);
  unload_map(0,block_border_map);
end

process PONG_donde_va_la_bola(x,y,current_dir_x,move_x,move_y);
begin
	while(x<PONG_id_stage.right_limit-PONG_WIDTH_TILE)
	    x+=current_dir_x*move_x;
		y+=move_y;
		// Cambiamos direcci�n x si se llega al l�mite de arriba o abajo del escenario
		If ( y<= PONG_id_stage.up_limit OR y + PONG_HEIGHT_TILE > PONG_id_stage.down_limit)
			move_y *= -1;
		End
	end
	PONG_donde_va_y = y;
end